package change

import (
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// ==================== 费率信息变更 ====================

// RateInfoChangeRequest 费率信息变更请求
type RateInfoChangeRequest struct {
	models.OrgBaseRequest
	// ApplyID 业务申请编号
	ApplyID string `json:"apply_id,omitempty"`
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// RateInfo 费率列表
	RateInfo []map[string]interface{} `json:"rate_info,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewRateInfoChangeRequest 创建费率信息变更请求
func NewRateInfoChangeRequest() *RateInfoChangeRequest {
	req := &RateInfoChangeRequest{}
	return req
}

// SetApplyID 设置业务申请编号
func (r *RateInfoChangeRequest) SetApplyID(applyID string) *RateInfoChangeRequest {
	r.ApplyID = applyID
	return r
}

// SetMerchNo 设置商户号
func (r *RateInfoChangeRequest) SetMerchNo(merchNo string) *RateInfoChangeRequest {
	r.MerchNo = merchNo
	return r
}

// SetRateInfo 设置费率列表
func (r *RateInfoChangeRequest) SetRateInfo(rateInfo []map[string]interface{}) *RateInfoChangeRequest {
	r.RateInfo = rateInfo
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *RateInfoChangeRequest) SetRawRequestMap(rawMap map[string]interface{}) *RateInfoChangeRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *RateInfoChangeRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *RateInfoChangeRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.ApplyID != "" {
		baseMap["apply_id"] = r.ApplyID
	}
	if r.MerchNo != "" {
		baseMap["merch_no"] = r.MerchNo
	}
	if r.RateInfo != nil && len(r.RateInfo) > 0 {
		baseMap["rate_info"] = r.RateInfo
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *RateInfoChangeRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// RateInfoChangeResponse 费率信息变更响应
type RateInfoChangeResponse struct {
	models.StandardResponse
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// ApplyID 业务申请编号
	ApplyID string `json:"apply_id,omitempty"`
}

// NewRateInfoChangeResponse 创建费率信息变更响应
func NewRateInfoChangeResponse() *RateInfoChangeResponse {
	return &RateInfoChangeResponse{}
}
